﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DiversosPlugin
{
    public class PrecoMedioDiario : VisaValeCheck.VisaValeCheckPluginBase
    {
        public override string Nome
        {
            get { return "MaxSpend"; }
        }

        public override string Descricao
        {
            get { return "Cálculo do valor diário máximo para se manter bem alimentado."; }
        }

        public override string Autor
        {
            get { return "Rogério Paladino"; }
        }

        public override void Executar()
        {
            int diasAteFinalMes = this.DiasAteFinalDoMes();            
            if (VisaInteractionObject.Saldo != null)
            {
                StringBuilder strInfo = new StringBuilder();
                double valMedio = VisaInteractionObject.Saldo.SaldoDisponivel / diasAteFinalMes;
                strInfo.AppendLine(string.Format("Gasto máximo diário: R$ {0:0.00}", valMedio));
                //base.CallEvento(string.Format("Gasto máximo diário: R$ {0:0.00}", valMedio));
                double valRecuperacaoDia = this.ValorParaEconomizar();
                if (valRecuperacaoDia > 0)
                {
                    //strInfo.AppendLine(string.Format("Economia diária: R$ {0:0.00}", valRecuperacaoDia));
                    //base.CallEvento(string.Format("Economia diária: R$ {0:0.00}", valRecuperacaoDia));
                }
                base.CallEvento(strInfo.ToString());                
            }
        }

        private int DiasAteFinalDoMes()
        {
            int diasAteFinalMes = 0;
            if (VisaInteractionObject.Saldo.ProximoDeposito != null)            
            {
                diasAteFinalMes = VisaInteractionObject.Saldo.ProximoDeposito.Data.Subtract(DateTime.Now.Date).Days + 1;
            } 
            else if (VisaInteractionObject.Saldo.UltimoBeneficio != null)
            {
                diasAteFinalMes = VisaInteractionObject.Saldo.UltimoBeneficio.Data.AddMonths(1).Subtract(DateTime.Now).Days + 2;
            }
            else
            {
                diasAteFinalMes = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
            }
            int k = diasAteFinalMes;
            for (int i = 1; i < diasAteFinalMes; i++)
            {
                DayOfWeek dataFutura = DateTime.Now.Date.AddDays(i).DayOfWeek;
                if (dataFutura == DayOfWeek.Sunday || dataFutura == DayOfWeek.Saturday)
                    k--;
            }            
            return (k == 0 ? 1 : k);
        }

        private double ValorParaEconomizar()
        {
            double sldDisponivel = VisaInteractionObject.Saldo.SaldoDisponivel;
            int diasAteFinalMes = this.DiasAteFinalDoMes();
            double sldNegativo = 15 - (sldDisponivel / diasAteFinalMes);
            double vlRecuperacao = 0;
            if (sldNegativo > 0)
            {
                vlRecuperacao = Math.Round(sldNegativo / diasAteFinalMes, 2);
            }
            return vlRecuperacao;
        }
    }
}
